package com.xiaoyu.arrays;

/**
 * @program: DS_and_A
 * @description: 删除数组中的所有指定元素!  leetCode27
 *
 * 给你一个数组 nums和一个值 val，你需要 原地 移除所有数值等于val的元素，并返回移除后数组的新长度。
 * 不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
 * 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
 *
 *
 * //当数字left等于n,right也等于n的时候,为了防止left++后错过相等判断
 *
 *{3,2,2,2,2,3,3} val =2的情况
 *
 *{3,2,2,3} , val = 2的情况
 *
 *
 * @author: YuWenYi
 * @create: 2021-04-22 10:57
 **/
public class RemoveElement {

   /*
   自己的错误写法!
   无法解决{3,2,2,3} , val =3的情况,还是想的太复杂了!!!
   public static int removeElement(int[] nums, int val) {
        int right = nums.length-1;
        int left = 0;
        while (left < nums.length){
            if (val != nums[left]){
                if (left == right)
                    break;
                left++;
                if (left == right){
                    right--;
                    break;
                }
            } else {
                if (left == right)
                {
                    right--;
                    break;
                }
                int temp = nums[right];
                nums[right] = nums[left];
                nums[left] = temp;
                right--;
            }
        }
        return right+1;
    }*/

    public static int removeElement(int[] nums, int val) {
        int slow = 0;
        int fast = 0;
        while (fast < nums.length){  //快指针遍历数组
            if (nums[fast] != val){  //如果找到了不等于val的值,即要保存下来的值
                nums[slow] = nums[fast]; //那么就存到最前面
                slow++;              //存完之后,慢指针加1,即代表已经有一个需要保存的值了,准备接收下一个
            }
            fast++;
        }
        return slow;   //最后返回slow的值,即最后一个别保存下来的值的索引,即新长度
    }

    public static void main(String[] args) {
        int[] nums = new int[]{0,1,2,2,3,0,4,2};
        int val = 2;  //需要删除所有val值为2的数组元素
        int len = removeElement(nums, val);
        System.out.println("--->"+len);
        for (int i = 0; i < len; i++) {
            System.out.println(nums[i]);   //[0,1,3,0,4]
        }
    }

}
